package ar.utn.frgp.banco.service;

import java.math.BigDecimal;
import java.util.List;

import ar.utn.frgp.banco.entity.Cuenta;
import ar.utn.frgp.banco.exceptions.PersonalisedException;
import ar.utn.frgp.banco.exceptions.ServiceException;

public interface GestionCuentasService {
	
	/**
	 * obtiene el listado de cuentas de un cliente.
	 * @param dni el DNI del cliente logueado.
	 * @return el listado de las cuentas
	 * @throws ServiceException Si ocurre un error de servicio.
	 * @throws PersonalisedException otro error.
	 */
	List<Cuenta> obteneCuentas(String dni) throws ServiceException,PersonalisedException;
	
	/**
	 * 
	 * @param dni el dni del cliente.
	 * @return la cantidad de cuentas corrientes que tiene el cliente.
	 * @throws ServiceException en caso de error.
	 * @throws PersonalisedException en caso de error.
	 */
	int cantidadCuentasCorrientes(String dni) throws ServiceException,PersonalisedException;
	
	/**
	 * 
	 * @param dni el dni del cliente.
	 * @return la cantidad de cuentas corrientes que tiene el cliente.
	 * @throws ServiceException en caso de error.
	 * @throws PersonalisedException en caso de error.
	 */
	int cantidadCajaAhorro(String dni) throws ServiceException,PersonalisedException;
	
	/**
	 * Obtiene las cuentas corrientes.
	 * @param dni
	 * @return
	 * @throws ServiceException
	 * @throws PersonalisedException
	 */
	List<Cuenta> obtenerCuentasCorrientes(String dni)throws ServiceException,PersonalisedException;
	
	/**
	 * Obtiene la caja de ahorro.
	 * @param dni
	 * @return
	 * @throws ServiceException
	 * @throws PersonalisedException
	 */
	Cuenta obtenerCajaAhorro(String dni)throws ServiceException,PersonalisedException;
	
	/**
	 * 
	 * @param dni el dni del cliente.
	 * @return la cantidad de cuentas corrientes que tiene el cliente.
	 * @throws ServiceException en caso de error.
	 * @throws PersonalisedException en caso de error.
	 */
	int tieneCajaDeAhorro(String dni) throws ServiceException,PersonalisedException;
	
	Cuenta crearCuenta(Cuenta cta,String dni) throws ServiceException,PersonalisedException;
	
	Cuenta obtenerCuentaCompleta(Long numero) throws ServiceException,PersonalisedException;
	
	/**
	 * Genera un deposito en una operaci�n por caja.
	 * @param idCuenta el id de la cuenta.
	 * @param monto la cantidad a depostiar.
	 * @return 
	 * @throws ServiceException
	 * @throws PersonalisedException
	 */
	Cuenta deposito(Long nroCuenta, BigDecimal monto)throws ServiceException,PersonalisedException;
	
	/**
	 * Genera una extracci�n en una operaci�n por caja.
	 * @param idCuenta el id de la cuenta.
	 * @param monto la cantidad a extraer
	 * @return 
	 * @throws ServiceException
	 * @throws PersonalisedException
	 */
	Cuenta extraccion(Long nroCuenta, BigDecimal monto)throws ServiceException,PersonalisedException;
	
	/**
	 * Efectua una transferencia entre cuentas.
	 * @param idCuenta
	 * @param monto
	 * @throws ServiceException
	 * @throws PersonalisedException
	 */
	void transferencia(Long idCuenta, BigDecimal monto,Long idCuentaDestino)throws ServiceException,PersonalisedException;
	
}
